﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AgendaManager.AgendaService;

namespace AgendaManager
{
    public partial class frmBusquedaContacto : Form
    {
        List<Contacto> Contactos { get; set; }
        List<Empresa> Empresas { get; set; }

        public frmBusquedaContacto()
        {
            InitializeComponent();
        }
        private void frmBusquedaContacto_Load(object sender, EventArgs e)
        {
            gvContactos.DataSource = null;
            Contactos = new List<Contacto>();
            Empresas = new List<Empresa>();

            RefreshContacts();
        }

        private void txFiltro_TextChanged(object sender, EventArgs e)
        {
            string filtro = txFiltro.Text.ToLower();

            var join = from contacto in Contactos
                       join empresa in Empresas
                       on contacto.Empresa equals empresa.Id
                       into outer
                       from sub in outer.DefaultIfEmpty()
                       select new
                       {
                           Id = contacto.Id,
                           Nombre = contacto.Nombre,
                           Apellido = contacto.Apellido,
                           Celular = contacto.Celular,
                           Empresa = sub == null ? string.Empty : sub.RazonSocial
                       };

            if (filtro != string.Empty)
            {
                join = join.Where(x => x.Apellido.ToLower().Contains(filtro)
                || x.Celular.ToLower().Contains(filtro)
                || x.Empresa.ToLower().Contains(filtro)
                || x.Nombre.ToLower().Contains(filtro));
            }

            gvContactos.DataSource = null;
            gvContactos.DataSource = join.ToList();
            gvContactos.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
            gvContactos.Columns["Id"].Visible = false;
        }

        private void btEdit_Click(object sender, EventArgs e)
        {
            if (gvContactos.SelectedRows.Count == 1)
            {
                Contacto c = Contactos.Find(x => x.Id == (int)gvContactos.SelectedRows[0].Cells["Id"].Value);

                //FotoContacto foto = ws.GetFotoContacto(c.Id);
                
                if (c != null)
                {
                    using (frmNuevoContacto f = new frmNuevoContacto())
                    {
                        f.Contacto = c;
                        
                        //if (foto.Foto != null)
                        //    f.FotoContacto = foto;
                       
                        if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                        {
                            RefreshContacts();
                        }
                    }
                }
            }
        }

        private void btRemove_Click(object sender, EventArgs e)
        {
            if (gvContactos.SelectedRows.Count == 1)
            {
                if (MessageBox.Show("Está seguro que desea eliminar el Contacto del sistema?",
                                "Eliminar Contacto.",
                                MessageBoxButtons.OKCancel,
                                MessageBoxIcon.Exclamation) == System.Windows.Forms.DialogResult.OK)
                {
                    Contacto c = Contactos.Find(x => x.Id == (int)gvContactos.SelectedRows[0].Cells["Id"].Value);

                    bool elimino = ConnectHelper.ws.DeleteEntity(c);

                    if (elimino)
                    {
                        MessageBox.Show("El Contacto ha sido eliminado exitosamente.",
                                "Eliminar Contacto.",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Information);

                        RefreshContacts();
                    }
                    else
                    {
                        MessageBox.Show("No se pudo eliminar el Contacto por favor intente nuevamente más tarde.",
                                "Eliminar Contacto.",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Exclamation);
                    }
                }
            }
            else
            {
                MessageBox.Show("Seleccione un solo contacto por favor.",
                                "Eliminar Contacto.",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
            }
        }

        private void btAdd_Click(object sender, EventArgs e)
        {
            using (frmNuevoContacto f = new frmNuevoContacto())
            {
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    RefreshContacts();
                }
            }
        }

        private void RefreshContacts()
        {
            gvContactos.DataSource = null;

            Contactos = ConnectHelper.ws.RetrieveEntities(new Contacto(), string.Empty).Cast<Contacto>().ToList();

            Empresas = ConnectHelper.ws.RetrieveEntities(new Empresa(), string.Empty).Cast<Empresa>().ToList();

            var join = from contacto in Contactos
                       join empresa in Empresas
                       on contacto.Empresa equals empresa.Id
                       into outer
                       from sub in outer.DefaultIfEmpty()
                       select new
                       {
                           Id = contacto.Id,
                           Nombre = contacto.Nombre,
                           Apellido = contacto.Apellido,
                           Celular = contacto.Celular,
                           Empresa = sub == null ? string.Empty : sub.RazonSocial
                       };

            gvContactos.DataSource = join.ToList();
            gvContactos.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
            gvContactos.Columns["Id"].Visible = false;
        }
    }
}
